home *** CD-ROM | disk | FTP | other *** search
/ AI Game Programming Wisdom / AIGameProgrammingWisdom.iso / SourceCode / 06 General Architectures / 06 Rabin / msgroute.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2001-12-10  |  2.3 KB  |  105 lines

  1. /* Copyright (C) Steve Rabin, 2001. 
  2.  * All rights reserved worldwide.
  3.  *
  4.  * This software is provided "as is" without express or implied
  5.  * warranties. You may freely copy and compile this source into
  6.  * applications you distribute provided that the copyright text
  7.  * below is included in the resulting source code, for example:
  8.  * "Portions Copyright (C) Steve Rabin, 2001"
  9.  */
  10.  
  11. #include "msgroute.h"
  12. #include "gameobject.h"
  13. #include "statemch.h"
  14. #include "database.h"
  15. #include "global.h"
  16. #include "time.h"
  17. #include "msg.h"
  18.  
  19.  
  20.  
  21. MsgRoute::MsgRoute( void )
  22. {
  23.  
  24. }
  25.  
  26.  
  27. MsgRoute::~MsgRoute( void )
  28. {
  29.  
  30. }
  31.  
  32.  
  33. void MsgRoute::SendMsg( float delay, MSG_Name name, objectID receiver, objectID sender, int state )
  34. {
  35.  
  36.     if( delay <= 0.0f )
  37.     {    //Deliver immediately
  38.         MSG_Object msg( g_time.GetCurTime(), name, receiver, sender, state );
  39.         RouteMsg( msg );
  40.     }
  41.     else
  42.     {    //Check for duplicates - then store
  43.         MessageContainer::iterator i;
  44.         for( i=m_delayedMessages.begin(); i!=m_delayedMessages.end(); ++i )
  45.         {
  46.             if( (*i)->IsDelivered() == false &&
  47.                 (*i)->GetMsgName() == name &&
  48.                 (*i)->GetReceiver() == receiver &&
  49.                 (*i)->GetSender() == sender &&
  50.                 (*i)->GetMsgState() == state )
  51.             {    //Already in list - don't add
  52.                 return;
  53.             }
  54.         }
  55.         
  56.         //Store in delivery list
  57.         float deliveryTime = delay + g_time.GetCurTime();
  58.         MSG_Object * msg = new MSG_Object( deliveryTime, name, receiver, sender, state );
  59.         m_delayedMessages.push_back( msg );
  60.     }
  61.  
  62. }
  63.  
  64.  
  65. void MsgRoute::DeliverDelayedMessages( void )
  66. {
  67.     MessageContainer::iterator i;
  68.     for( i=m_delayedMessages.begin(); i!=m_delayedMessages.end(); ++i )
  69.     {
  70.         float dtime = (*i)->GetDeliveryTime();
  71.         float ctime = g_time.GetCurTime();
  72.         if( (*i)->GetDeliveryTime() <= g_time.GetCurTime() )
  73.         {    //Deliver and delete msg
  74.             MSG_Object * msg = *i;
  75.             RouteMsg( *msg );
  76.             delete( msg );
  77.             i = m_delayedMessages.erase( i );
  78.         }
  79.     }
  80.  
  81. }
  82.  
  83. void MsgRoute::RouteMsg( MSG_Object & msg )
  84. {
  85.     GameObject * object = g_database.Find( msg.GetReceiver() );
  86.  
  87.     if( object != 0 )
  88.     {
  89.         if( msg.GetMsgState() < 0 || 
  90.             msg.GetMsgState() == object->GetStateMachine()->GetState() )
  91.         {    //State was irrelevant or current state matches msg state (for msg scoping)
  92.             msg.SetDelivered( true );
  93.             object->GetStateMachine()->Process( EVENT_Message, &msg );
  94.         }
  95.     }
  96.  
  97. }
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.